iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

在練習開發 Compose 時,都是直接用 IntelliJ IDEA 的 Run Configuration 直接把 App 跑起來,雖然方便,但若要讓所有使用者都能用到這個 App 的話,就得先編譯程式碼並打包成各作業系統可使用的安裝執行檔。

使用 Gradle 打包

Compose for Desktop 專案在建立時,就在 Build Script 裡設定好 org.jetbrains.compose Gradle Plugin。這個 Plugin 提供許多跟運行、檢查、打包 App 相關的 Task。在 IntelliJ IDEA 裡打開 Gradle 工具視窗,就可以看到 Tasks 底下有 compose desktop 資料夾,裡面有許多常用的指令可以執行,包括:

  • run:以 run 為首的指令,會運行 Build Script 裡指定的 mainClass(該檔案裡需要有 main 函式),在運行時會使用整個 JVM Runtime 且不會預先打包,這樣可以讓運行和除錯更些。假如想要取得最小化 Runtime 且壓縮過的 Binary,請改用 runDistributable
  • createDistributable:用來建立沒有安裝程式的可發佈映像檔。
  • package<FormatName>:以 package 為首的指令,像是 packageDebpackageDmgpackageMsi 等可以將 App 打包成對應平台的安裝執行檔。若想要一次打包,可以使用 package 指令。不過各平台只能打包自己平台的安裝執行檔,若在單一平台執行全平台打包,則其他平台的指令會自動跳過。建立好的打包檔會放在 ${project.buildDir}/compose/binaries 底下。

調整打包設定

在打包 App 時,透過修改 Gradle Build Script,就可以調整打包設定,包括:

  • packageName:應用程式的名稱,預設為 Gradle 的專案名稱。
  • packageVersion:應用程式打包的版本號。
  • version:應用程式的版本號,預設為 Gradle 的專案版本號。
  • description:應用程式的描述,預設為空。
  • copyright:應用程式的版權資訊,預設為空。
  • vendor:應用程式的製作單位,預設為空。
  • licenseFile:應用程式的授權資訊,預設為空。
  • 設定要一起打包的 JDK Module:Gradle 會用 jlink 找出必要的 JDK Module 後打包來最小化發佈檔的檔案大小。使用 modules() 自行指定,或用 includeAllModules = true 打包所有 Module。也可以執行 suggestRuntimeModules Gradle Task,這個指令會用 jdeps 靜態分析工具找出需要的 Module
  • 設定打包後輸出的格式:使用 targetFormats() 指定要輸出哪些格式,包括 macOS 上的 TargetFormat.Dmg、Windows 上的 TargetFormat.Msi 及 Linux 上的 TargetFormat.Deb
  • 設定 App Icon:指定圖示檔案成 App Icon,詳細設定可參考 Day 7
compose.desktop {
    application {
        nativeDistributions {
            packageName = "ExampleApp"
            packageVersion = "..."
            version = "0.1-SNAPSHOT"
            description = "Compose Example App"
            copyright = "© 2020 My Name. All rights reserved."
            vendor = "Example vendor"
            licenseFile.set(project.file("LICENSE.txt")) 
            
            // 設定要一起打包的 JDK Module(擇一使用)
            modules("java.sql")
            includeAllModules = true
            
            // 設定支援的發佈格式
            targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
            
            linux {
              // Linux 作業系統專屬的設定 
            }
            macOS {
              // macOS 作業系統專屬的設定 
            }
            windows {
              // Windows 作業系統專屬的設定
            }
        }
    }
}

在使用 Gradle 打包時需要注意三件事:

  • Compose for Desktop 目前是運行在 JVM 上,打包時需要使用 JDK 15 以上的版本。雖然 Compose for Desktop 是運行在 JVM 上,但因為打包時可以把 JVM 一起打包,所以使用者的電腦上不需要自行安裝 JVM。
  • 在運行打包指令時,Gradle 只能打包運行平台的版本,也就是說用 macOS 運行打包指令只能打包出 macOS 的 App,若要打包三種作業系統的 App,就需要三種作業系統的機器才有辦法打包出三種版本。
  • 在 macOS 作業系統上打包會需要簽署和公證,整個流程相對較複雜且部份需要手動執行,詳細的步驟請參考 Compose for Desktop 的完整官方教學

付費打包工具

除了內建的 Gradle 打包指令外,也有公司開發了功能更多更完整的打包工具,如 Conveyor。若讀者的專案是開放原始碼的話,有免費授權可以使用,不過若是用在商業專案的話,就會需要另外購買 Conveyor 授權。Conveyor 提供了許多 Gradle 指令所沒有的功能,包括:

  • 線上更新 :Gradle 指令只能將程式碼打包,使用者需要手動下載後再重新安裝。而 Conveyor 則可以在各作業系統背景下載新版本後自動更新。
  • 跨平台建置 :Gradle 指令只能將 App 打包成運行平台上的執行檔,也就是說要有三種平台的執行檔,就需要三種作業系統的機器。Conveyor 則可以在任何作業系統上打包出所有平台的執行檔,包括建置、簽證等全部流程。
  • 自我簽證 :開發者不需要購買簽署憑證,不過需要使用者在 Terminal 裡複製貼上指令。
  • 下載頁面 :自動產生 App 的下載網頁,且可自動偵測使用者使用的作業系統及 CPU 架構。
  • 圖示轉換 :Gradle 指令需要將所有圖示依尺寸準備好後打包,Conveyor 可以自動轉換圖示以符合各平台打包時的需求。
  • 最佳化檔案大小 :在打包時會自動使用 jdeps 偵測,只打包有使用到的 JDK Module 以減少應用程式的檔案大小。
  • 支援 Accessibility :自動使用 Java Accessibility Bridge 來支援螢幕閱讀器來提升 Accessibility。
  • 支援 Windows 10/11 打包格式 :Conveyor 在發佈至 Windows 10/11 時會使用 MSIX 格式,方便 IT 部門支援 Windows 的網路管理工具。
  • 支援 CLI :支援打包 Terminal App,也可以將 CLI 打包進 App 裡。
  • 商業支援 :提供付費的商業技術支援。

若覺得內建的 Gradle 指令不符合需求,看完以上的功能差異後想要了解 Conveyor 詳細的功能與打包流程,可以參考這篇官方教學

參考資料


上一篇
第 25 天:結合(Multiplatform)Library
下一篇
第 27 天:建置 CI 流程
系列文
傳教士的 Compose for Desktop 耕讀筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言